package com.situ.dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {
    static Connection con = null;
    static PreparedStatement pst = null;
    static ResultSet res = null;
    
    static // 数据库用户及密码
    String url = "jdbc:mysql://127.0.0.1:3306/stu_company?" + "useSSL=false&useUnicode=true&characterEncoding=utf8&"
            + "allowPublicKeyRetrieval=true&" + "serverTimezone=Hongkong";
    static String user = "root";
    static String password = "wly051219";
    
//    static {
//        String driver = "com.mysql.cj.jdbc.Driver";
//        try {
//            Class.forName(driver);
//        } catch (ClassNotFoundException e) {
//            System.err.println("装载 JDBC/ODBC 驱动程序失败。");
//            e.printStackTrace();
//        }
//    }


    // 默认数据库，账号为root
    public static void connDB() {
        try {
            con = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            System.err.println("无法连接数据库");
            e.printStackTrace();
        }
    }

    /**
     * <p>Title: connDB</p>  
     * <p>Description: // 默认MySql数据库，自定义库，自定义账号</p>  
     * @author 恩策
     * @date 2021年8月6日
     * @param url 
     * @param user
     * @param password
     */
    public static void connDB(String DB, String user, String password) {
        String url = "jdbc:mysql://127.0.0.1:3306/" + DB +"?" + "useSSL=false&useUnicode=true&characterEncoding=utf8&"
                + "allowPublicKeyRetrieval=true&" + "serverTimezone=Hongkong";
        try {
            con = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            System.err.println("无法连接数据库");
            e.printStackTrace();
        }
    }

    /**
     * <p>Title: connDB</p>  
     * <p>Description: 读取properties文件连接数据库</p>  
     * @author 恩策
     * @date 2021年8月6日
     * @param filesPath
     */
    public static void connDB(String filePath) {
        try {
            // 加载，读取 jdbc.properties 配置的信息
            // pro.load 的作用是把 jdbc.properties 文件中配置的信息，一一 put 到 pro 这个 map 中
            Properties pro = new Properties();
            pro.load(ClassLoader.getSystemClassLoader().getResourceAsStream(filePath));
            // drivername = pro.getProperty("key")
            String drivername = pro.getProperty("drivername");
            String url = pro.getProperty("url");
            String user = pro.getProperty("user");
            String password = pro.getProperty("password");
            // 注册驱动，加载驱动
            Class.forName(drivername);
            // 连接数据库
            try {
                con = DriverManager.getConnection(url, user, password);
            } catch (SQLException e) {
                System.err.println("无法连接数据库");
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    
    /**
     * <p>Title: searchD</p>  
     * <p>Description: 查询数据库</p>  
     * @author 恩策
     * @date 2021年8月6日
      * @param arr SQL语句参数
     * @return SQL语句影响的数据条数
     * @return ResultSet结果
     * @throws SQLException
     */
    public static ResultSet searchD(String sql, Object[] arr) throws SQLException {
        // connDB();
        pst = null;
        try {
            pst = con.prepareStatement(sql);
            if (arr != null) {
                for (int i = 0; i < arr.length; i++) {
                    pst.setObject(i + 1, arr[i]);
                }
            }
            res = pst.executeQuery();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

    /**
     * <p>Title: updateU</p>  
     * <p>Description: 处理增删改操作, 默认数据库以字符串存储非物理主键的字段</p>  
     * @author 恩策
     * @date 2021年8月6日
     * @param sql PrepareStatement需求的SQL语句
     * @param arr SQL语句参数
     * @return SQL语句影响的数据条数
     * @throws SQLException
     */
    public static int updateU(String sql, Object[] arr) throws SQLException {
        int count = 0;
        pst = null;
        try {
            pst = con.prepareStatement(sql);
            if (arr != null) {
                for (int i = 0; i < arr.length; i++) {
                    pst.setObject(i + 1, arr[i]);
                }
            }
            count = pst.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }
    
    /**
     * <p>Title: updateUs</p>  
     * <p>Description: 批处理一条SQL语句，多条参数的操作
     * insert into ? values(...)</p>  
     * @author 恩策
     * @date 2021年8月6日
     * @param sql
     * @param arr[][] 
     * @return
     */
    public static int[] updateUs(String sql, Object[][] arr) {
        int[] count = null;
        pst = null;
        try {
            pst = con.prepareStatement(sql);
            if (arr != null) {
                for (int i = 0; i < arr.length; i++) {
                    for (int j = 0; j < arr[i].length; j++) {
                        pst.setObject(j + 1, arr[i][j]);                        
                    }
                    pst.addBatch(); // 添加到批处理中
                }                
                count = pst.executeBatch();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }

/*  
    public static ResultSet sreachDs(String sql, Object[][] arr) {
        res = null;
        pst = null;
        try {
            pst = con.prepareStatement(sql);
            if (arr != null) {
                for (int i = 0; i < arr.length; i++) {
                    for (int j = 0; j < arr[i].length; j++) {
                        pst.setObject(j + 1, arr[i][j]);                        
                    }
                    pst.addBatch(); // 添加到批处理中
                }                
                res = pst.executeBatch();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    } 
*/
    

    // 断开链接
    public static void disconnects() {
        if (res != null) {
            try {
                res.close();
                res = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pst != null) {
            try {
                pst.close();
                pst = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
                con = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 私有化构造器
    private JDBCUtils() {
    };

}
